package fabrica2.persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import fabrica2.excecoes.DAOException;
import fabrica2.modelo.Acao;

@SuppressWarnings("deprecation")
public class AcaoDAO extends GenericDAOImpl<Acao> implements Dao<Acao> {

	
	@Override
	public Acao persistir(Acao acao) throws DAOException{
		String query = "SELECT * FROM Acao where id_acao = "
			+ acao.getIdAcao();
		ResultSet rs = getResultSet(query);
		try {
			// Se existir atualiza
			if (rs.next()) {
				execute("UPDATE Acao SET id_evento = " +
						acao.getIdEvento() + ", coordenador = " +
						acao.getCoordenador() + ", descricao = '" + acao.getDescricao()+"'"
						+ " data = '" + acao.getData()+"' WHERE id_acao = " + acao.getIdAcao()
						);
			}
			// Ou cria um novo
			else {
				execute("INSERT INTO Acao (id_evento, coordenador, descricao, data) VALUES ("
						+ ""  + acao.getIdEvento() + ", "
						+ "" +  acao.getCoordenador() + ", "
						+ "'" + acao.getDescricao() + "', "
						+ "'" + acao.getData()+"') " 
						);
				//Atualiza o ID caso novo objeto
				String update = "SELECT * FROM Acao where id_evento = "+acao.getIdEvento() + " AND coordenador = "+ acao.getCoordenador() + " AND descricao = '"+acao.getDescricao()+"' AND data = '"+acao.getData()+"'";
				rs = getResultSet(update);
				if (rs.next()) {
						acao.setIdAcao(rs.getInt("id_acao"));
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOException();
		}finally{
			desconectar();
		}
		return acao;
	}

	@Override
	public void remover(Acao acao) throws DAOException {
		conectar();
		ResultSet rs = getResultSet("SELECT * FROM Acao WHERE id_acao = "
				+ acao.getIdAcao());
		try {
			if (rs.next()) {
				execute("DELETE FROM Acao where id_acao = " + acao.getIdAcao());
			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}

	}

	@SuppressWarnings("deprecation")
	@Override
	public List<Acao> listar() throws DAOException {
		conectar();
		ResultSet rs = getResultSet("SELECT * FROM Acao ");
		List<Acao> acoes = new ArrayList<Acao>();
		Acao acao = new Acao();
		try {
			while (rs.next()) {
				acao.setIdAcao(rs.getInt("id_acao"));
				acao.setIdEvento(rs.getInt("id_evento"));
				acao.setCoordenador(rs.getInt("coordenador"));
				acao.setDescricao(rs.getString("descricao"));
				acao.setData(rs.getDate("data"));
				acoes.add(acao);

			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return acoes;
	}

	public Acao getPorId(int id) throws DAOException {
		conectar();
		ResultSet rs = getResultSet("SELECT * FROM Acao WHERE id_acao = " + id);
		Acao acao = new Acao();
		try {
			while (rs.next()) {
				acao.setIdAcao(rs.getInt("id_acao"));
				acao.setIdEvento(rs.getInt("id_evento"));
				acao.setCoordenador(rs.getInt("coordenador"));
				acao.setDescricao(rs.getString("descricao"));
				acao.setData(rs.getDate("data"));

			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return acao;
	}

	public List<Acao> getAcoes(int idEvento) throws DAOException {
		conectar();
		ResultSet rs = getResultSet("SELECT * FROM Acao WHERE id_evento = "
				+ idEvento);
		List<Acao> acoes = new ArrayList<Acao>();
		Acao acao = new Acao();
		try {
			while (rs.next()) {
				acao.setIdAcao(rs.getInt("id_acao"));
				acao.setIdEvento(rs.getInt("id_evento"));
				acao.setCoordenador(rs.getInt("coordenador"));
				acao.setDescricao(rs.getString("descricao"));
				acao.setData(rs.getDate("data"));
				acoes.add(acao);
			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return acoes;
	}

	public List<Acao> getAcoesPorCliente(int idCliente) throws DAOException {
		conectar();
		ResultSet rs = getResultSet("EXEC sp_getAcaoPorCliente " + idCliente);
		List<Acao> acoes = new ArrayList<Acao>();
		Acao acao = new Acao();
		try {
			while (rs.next()) {
				acao.setIdAcao(rs.getInt("id_acao"));
				acao.setIdEvento(rs.getInt("id_evento"));
				acao.setCoordenador(rs.getInt("coordenador"));
				acao.setDescricao(rs.getString("descricao"));
				acao.setData(rs.getDate("data"));
				acoes.add(acao);

			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return acoes;
	}

	public List<Acao> getAcoesPorFuncionario(int idFuncionario)
			throws DAOException {
		conectar();
		ResultSet rs = getResultSet("EXEC sp_getAcaoPorFuncionario "
				+ idFuncionario);
		List<Acao> acoes = new ArrayList<Acao>();
		Acao acao = new Acao();
		try {
			while (rs.next()) {
				acao.setIdAcao(rs.getInt("id_acao"));
				acao.setIdEvento(rs.getInt("id_evento"));
				acao.setCoordenador(rs.getInt("coordenador"));
				acao.setDescricao(rs.getString("descricao"));
				acao.setData(rs.getDate("data"));
				acoes.add(acao);

			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return acoes;
	}

	public void removerPorId(int idAcao) throws DAOException {
		conectar();
		ResultSet rs = getResultSet("SELECT * FROM Acao where id_acao = "
				+ idAcao);
		try {
			if (rs.next()) {
				execute("DELETE FROM Acao where id_acao = " + idAcao);
			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}

	}

}// FIM classe AcaoDAO
